/**
 * 应用工具包，大概包含以下功能：
 * · 获取当前用户的登陆信息
 * · 获取枚举类型、系统参数、用户参数等
 * @author LinZongxue 2011-12-2
 */
define(function() {
	window.au = window.AppUtils = {
		/**
		 * 在主界面中打开js模块标签页。
		 * @param menuId 菜单的id，可选
		 * @param jsModule 要在标签页中显示的js模块
		 * @param title 标签页的标题
		 * @param titleTip 标签页标题的提示，可选
		 * @param unclosable 为true时标签页不允许关闭，可选
		 * @param unactive 为true时不立即激活标签页，可选
		 */
		openTab: function(menuId, jsModule, title, titleTip, unclosable, unactive){
			if (lu.isStr(menuId)){ //如果没有传入menuId，参数重新调整位置
				unclosable = titleTip; titleTip = title; title = jsModule; jsModule = menuId; menuId = null;
			}
			if (!jsModule || !title){
				alert('window.openTab(jsModule, title, titleTip, unclosable): 参数jsModule和title不能为空'); return;
			}
			if (typeof(titleTip) === 'boolean'){
				unclosable = titleTip; titleTip = null;
			}
			var mainPanel = this.getMainPanel();
			var tabs = mainPanel.find('jsModule', jsModule); //通过jsModule来确定标签页的唯一性
			if (tabs.length > 0){
				if(DEBUG){ //调试模式，删除再打开，达到重新加载js文件的效果
					mainPanel.remove(tabs[0]);
				}
				else{ //非调试模式，激活已打开的标签页，不重新加载
					mainPanel.setActiveTab(tabs[0]);
					return;
				}
			}
			//加载模块
			use(jsModule, function(Panel){
				var panel = new Panel({
					jsModule: jsModule,
					menuId: menuId, //记住菜单id
					title: title,
					tabTip: titleTip ? titleTip.replace(/\//g, '->') : null,
					closable: !unclosable
				});
				mainPanel.add(panel);
				if (!unactive) mainPanel.activate(panel);
			});
		},
		/**
		 * 在主界面中打开指定的url标签页。
		 * @param url 要在标签页中显示的js模块
		 * @param title 标签页的标题
		 * @param titleTip 标签页标题的提示
		 */
		openUrlTab: function(url, title, titleTip){
			if (!title || !url){
				alert('window.openUrlTab(url, titile): 参数url和title不能为空'); return;
			}
			var mainPanel = this.getMainPanel();
			var tabs = mainPanel.find("url", url);
			if (tabs.length > 0){
				mainPanel.setActiveTab(tabs[0]);
				return;
			}
			var panel = new Ext.Panel({
				title: title, 
				closable: true,
				tabTip: titleTip ? titleTip.replace(/\//g, '->') : null,
				html: String.format('<iframe src="{0}" width="100%" height="100%" frameborder="0" scrolling="yes"></iframe>', url),
				url: url
			});
			mainPanel.add(panel);
			mainPanel.activate(panel);
		},
		/**
		 * 获取主界面的头面板，此方法在Application.js中实现。
		 */
		getHeadPanel: function(){},
		/**
		 * 获取主界面的菜单面板，此方法在Application.js中实现。
		 */
		getMenuPanel: function(){},
		/**
		 * 获取主界面的主面板，此方法在Application.js中实现。
		 */
		getMainPanel: function(){},
		/**
		 * 获取登陆信息
		 */
		getLoginInfo: function(){
			return this.loginInfo;
		},
		/**
		 * 设置登陆信息
		 */
		setLoginInfo: function(loginInfo){
			this.loginInfo = loginInfo;
		},
		/**
		 * 判断当前用户是否有某种权限，或从数组中过滤出有权限的元素，这取决于参数类型。
		 * @param value 有三种值可选：
		 * 		1. 菜单id
		 * 		2. 菜单name(按钮name要全称)
		 * 		3. 元素数组，要判断权限的元素具有permitId属性，该属性值为第1或第2种情况
		 */
		permit: function(value){
			if (!lu.isArray(value)){
				//判断是否具有某个权限
				if (this.loginInfo.user.isAdmin) return true;
				if (!this.loginInfo || !this.loginInfo.menus) return false;
				var field = parseInt(value) ? 'id' : 'name';
				for (var i = 0; i < this.loginInfo.menus.length; i ++){
					if (this.loginInfo.menus[i][field] == value) return true;
				}
				return false;
			}
			else{
				//过滤出具有权限数组元素
				return lu.filterArray(value, function(item){
					var permitId = item.permitId;
					return !permitId || this.permit(permitId);
				}, this);
			}
		},
		/**
		 * 以对象的形式返回指定类型的枚举，格式为{name1:text1, name2:text2, ...}
		 * @param name 枚举名称，对应java类中的枚举类路径，但是要除掉"xx.xx.xx.module"的部分
		 */
		getEnum: function(name){
			if (!this.enumCache[name]){
				this.enumCache[name] = cu.sync('sys/util/getEnumItems.do?c=' + name);
			}
			return this.enumCache[name];
		},
		/**
		 * 获取指定类型的枚举的指定项的文本
		 * @param enumName 枚举名称，对应java类中的枚举类路径，但是要除掉"xx.xx.xx.module"的部分
		 * @param itemName 枚举项的名称
		 */
		getEnumItemText: function(enumName, itemName){
			if (!itemName) return '';
			var enums = this.getEnum(enumName);
			return enums && enums[itemName] ? enums[itemName] : '';
		},
		/**
		 * 以数组的形式返回枚举，格式为：[[name,text],...]
		 * @param name 枚举名称，对应java类中的枚举类路径，但是要除掉"xx.xx.xx.module"的部分
		 */
		getEnumArray: function(name){
			var items = [];
			var enum_ = this.getEnum(name);
			for (var i in enum_){
				items.push([i, enum_[i]]);
			}
			return items;
		},
		/**
		 * 获取指定类型的所有字典项，返回格式为：{字典值1: 字典项对象1, 字典值2: 字典项对象2,...}
		 */
		getDict: function(typeName){
			var dict = this.dictCache[typeName];
			if (!dict){
				var items = cu.sync('sys/dict/getItemsByTypeName.do?typeName=' + typeName);
				dict = {};
				Ext.each(items, function(item){
					dict[item.value] = item;
				});
				this.dictCache[typeName] = dict;
			}
			return dict;
		},
		/**
		 * 获取指定类型的所有字典项，返回格式为[[字典值1,显示值1],[字典值2,显示值2],...]，
		 * 适合combo要求的数据格式。
		 */
		getDictItems: function(typeName){
			var dict = this.getDict(typeName);
			var items = [];
			for (var value in dict){
				items.push([value, dict[value].text]);
			}
			return items;
		},
		/**
		 * 将字典值翻译为显示值
		 */
		getDictText: function(typeName, value){
			var dict = this.getDict(typeName)[value];
			return dict ? dict.text : '';
		},
		/**
		 * 获取系统参数
		 */
		getSysParam: function(name){
			return cu.sync('sys/param/getSysParam.do?name=' + name);
		},
		/**
		 * 获取用户参数
		 */
		getUserParam: function(name){
			return cu.sync('sys/param/getUserParam.do?name=' + name);
		},
		/**
		 * 退出登陆
		 */
		logout: function(){
			cu.confirm('确定要退出系统吗？', function(){
				cu.post({
					url: 'sys/user/logout.do',
					success: function(){
						location.href = location.href;
					}
				});
			});
		},
		/**
		 * 当前用户修改密码
		 */
		changePassword: function(){
			use('sys.ChangePwdWindow', function(Win){
				new Win({
					callback: function(){
						cu.hint('密码修改成功', 1200);
					}
				}).show();
			});
		},
		/**
		 * 设置cookie，cookie名称必须在AppConsts.cookieName设置。
		 * @param name 要设置的名称
		 * @param value  要设置的值
		 */
		setCookie: function(name, value){
			var cookieName = AppConsts.cookieName[name];
			if (!cookieName){
				alert('设置cookie失败：在cookieName常量 中找不到对应的名称"' + name + '"');
				return;
			}
			this.cookieProvider.set(cookieName, value);
		},
		/**
		 * 读取cookie，cookie名称必须在AppConsts.cookieName设置。
		 * @param name 要读取的cookie名称
		 * @param defaultValue 指定名称不存在时返回的值
		 */
		getCookie: function(name, defaultValue){
			var cookieName = AppConsts.cookieName[name];
			if (!cookieName){
				alert('读取cookie失败：在cookieName常量 中找不到对应的名称"' + name + '"');
				return null;
			}
			return this.cookieProvider.get(cookieName, defaultValue);
		},
		//private: cookie操作对象
		cookieProvider: new Ext.state.CookieProvider({expires: new Date(new Date().getTime()+(3600000*24*180))}),
		//保存当前用户的登陆信息
		loginInfo: null,
		//private: 枚举缓存
		enumCache: {},
		//字典缓存
		dictCache: {},
		none: null //占位
	};
	
});